/**
 * --------------------------------------
 * FileName: main.c
 * Content: 
 *      数据结构第二周第一次作业:
 *          将题目的程序写成函数，并记录各个
 *          程序的 @ 语句执行次数，将其输出
 *          到stdout
 * 
 * Date:    25/09/15
 * Auther:  杨则瑞
 * Encode:  utf-8 | CRLF
 * --------------------------------------
 */


#include<stdio.h>
#include<windows.h>


int counter = 0; // 全局计数器

int n = 0;       // 全局n



// 所有的测试代码被包在函数里面，使用公共的全局变量 n
void fn1();
void fn2();
void fn3();
void fn4();
void fn5();
void fn6();
void fn7();
void fn8();




// 定义函数指针类型
typedef void (*fnptr_t)();

// 把8个函数函数注册到函数表.
const fnptr_t functions [8] = 
{
    fn1, fn2, fn3, fn4,
    fn5, fn6, fn7, fn8
};


int main(int argc, char* argv[]) 
{

    int status = scanf("%d", &n);
    int func_iter = 0;  // 用于迭代函数的迭代计数器

    
    if(status == 0)
    {
        // 当输入不正确时
        fprintf(stderr,"Input Error(can't get a integer from stdin).\n");
        
        #ifdef DESKTOP
        system("pause");        
        #endif

        return -1;
    }


    // 输出表头
    printf("index, AT_times\r\n");

    for(func_iter = 0; func_iter < 8; ++ func_iter)
    {
        // 清除全局计数器
        counter = 0; 

        // 调用函数
        functions[func_iter]();

        // 输出结果
        printf("%5d, %8d\r\n",func_iter + 1, counter);

    }

    #ifdef DESKTOP
    system("pause");        
    #endif

    return 0;

} // main





// 用于计数的函数，调用一次给计数器加一
void at()
{
    ++ counter;

} // at



// (1)
void fn1() 
{ 
    int i, k;  
    i=1; k=0;
    while(i<=n-1)
    { 
        at();
        k+=10*i;
        i++;
    }

} // fn1


// (2)
void fn2() 
{ 
    int i, k;

    i=1; k=0;
    do 
    {
        at();
        k+=10*i;
        i++;
    }
    while(i<=n-1);

} // fn2



// (3)
void fn3() 
{ 
    int i, k;

    i=1; k=0;
    while(i<=n-1)
    {
        i++;
        at();
        k+=10*i;
    }

} // fn3



// (4)
void fn4() 
{
    int i, j;
    int k = 0;

    for(i=1;i<=n;i++)
    {
        for(j=i;j<=n;j++)
        {
            at();
            k++;
        }
    }

} // fn4



// (5)
void fn5() 
{ 
    int i, j, k;
    int x = 0;
    int delta = 1;

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=i;j++)
        {
            for(k=1;k<=j;k++)
            {
                at();
                x+=delta;
            }
        
        }

    }

} // fn5




// (6)
void fn6() 
{ 
    int i, j;
    i=1; j=0;
    while(i+j<=n)
    {
        at();

        if(i > j) {
            j ++;
        }
        else  
        {
            i++;
        }
    }

} // fn6




// (7)
void fn7() 
{
    int x, y;

    x=n;  y=0;  //n不小于1
    while(x>=(y+1)*(y+1))
    {
        at();
        y++;
    }
   
} // fn7




// (8)
void fn8() 
{ 
    int x, y;

    x=91;  y=100; 
    while(y>0)
    {
        at();
        if (x>100)
        {
            x-=10;  
            y--;
        }
        else x++;
    }

} // fn8
